缓存 Rive 文件
缓存 Rive 文件可让你在多个 Rive 组件实例之间共享同一文件,从而减少内存占用和加载时间,因为文件只需加载和解码一次。
示例用法
在 Flutter 中,你需要负责管理 Rive 文件的生命周期。你可以直接创建 File 对象,也可以配合 RiveWidgetBuilder 使用 FileLoader 便捷类。在这两种情况下,必须在不再需要时调用 dispose() 来释放内存。
import 'package:flutter/material.dart';
import 'package:rive/rive.dart';
class CachedPage extends StatefulWidget {
const CachedPage({super.key});
@override
State<CachedPage> createState() => _CachedPageState();
}
class _CachedPageState extends State<CachedPage> {
var _isRivLoaded = false;
// 这是我们缓存文件存放的位置。
late File _riveFile;
@override
void initState() {
super.initState();
// 初始化后,通过更新 _isRivLoaded 来构建布局。
_initRive().whenComplete(
() => setState(() {
_isRivLoaded = true;
}),
);
}
Future<void> _initRive() async {
// 从资源中获取 Rive 文件。
_riveFile = (await File.asset(
"assets/rewards_demo.riv",
riveFactory: Factory.rive,
))!;
}
@override
void dispose() {
_riveFile.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (_isRivLoaded) {
// 两个组件都可以使用同一个 Rive 文件,因为我们将其缓存为状态。
final widget1 = RiveWidget(controller: RiveWidgetController(_riveFile));
final widget2 = RiveWidget(controller: RiveWidgetController(_riveFile));
return Scaffold(
body: Row(
children: [
Expanded(child: widget1),
Expanded(child: widget2),
],
),
);
} else {
return CircularProgressIndicator();
}
}
}
为了优化内存使用,如果多个
RiveWidget实例使用相同的.riv文件,请复用同一个File对象。这确保文件只加载一次并在内存中共享。
⚠️ 警告:
File被释放后无法再次使用。要使用相同的.riv文件,需要创建一个新的File对象。
管理状态
如何保持 Rive File 存活并与组件共享取决于你的状态管理方法。对于全局访问,可以在 main 中或应用启动时加载文件,并使用 Provider 之类的包将其暴露出来。如果文 件只在应用的特定部分需要,请考虑仅在需要时加载文件。
内存
自行管理文件可以让你精细控制内存使用,尤其是当同一个 Rive 文件在多个地方或多个组件中同时使用时。如果需要,使用 Flutter DevTools 内存工具 来监控和优化内存。
网络资源
要从互联网加载 Rive 文件,请使用 File.url('YOUR:URL')。对于网络资源,将文件缓存在内存中以避免重复下载和不必要的文件解码。